IBM Cloud Functionsでバックグラウンド処理をする2021年8月版
https://gyazo.com/f039efb4b29691527110359ef4b156eb
Bluemix時代/wskdeployを使うんや/いやいやibmcloudコマンドを使うんや/zipでまとめるんや/webpackや
など大量の言説が出てくる、オフィシャルの…
TypeScript Templateも3年前で更新止まってるし、ワンパターンのみなのであまり参考にできそうにない
openwhiskがベースになっているため、基本的にそこらへんのドキュメントを漁れば大抵はうまくいきます 現在でも参考になるリンク
ありがとうございます
ibmcloud iam service idsをibmcloud iam service-idsと読み替える
ありがとうございます
調査した結果、必要なのは
ibmcloudコマンド
node
manifest.yamlを書くのに必要な知識がほぼ全て乗っている
やっていきます
ibmcloud関連セットアップ
インスコ(マッコス)
code:sh
brew install ibm-cloud-cli
kubectl/docker.app(cask)をdepsとしており、/Applications/Docker.appがbrew支配下にないとコケる、どうしても現在のDocker.appを飛ばしたくない場合はignoredepsなどを使うこと
プラグイン入れる
code:sh
ibmcloud plugin install cloud-functions
ここから下の過程はセッション切れの度に必要になる
APIキーでのログインが便利
code:sh
ibmcloud login --apikey <APIKEY>
ログイン(APIキーの場合はスキップ)
code:bash
ibmcloud login
ブラウザーなどで連携などではなく直接パスワードを入れる必要があり面倒、APIキーがおすすめ
今のNSを引っ張ってくる
code:bash
ibmcloud target -r jp-tok
ibmcloud resource groups
DefaultのIDをコピる
code:sh
ibmcloud target -g <defaultのid>
code:sh
ibmcloud fn namespace list
code:sh
ibmcloud fn namespace target <使いたいnamespace>
これでとりあえずデプロイができるようになる
以上の手順をシェルスクリプトにでもして~に置いておくとログインが楽
~/ibm_login.sh にしている
code:~/ibm_login.sh
ibmcloud login --apikey XXXX
ibmcloud target -g XXXX
ibmcloud fn namespace target XXXX
ファイルへのアクセスを制限ができるわけではないのか
バンドラーは好みですが、変にはまらないようにwebpackにしましょう これらを揃えて、yarn build && yarn deployすると…
Success: Deployment completed successfully.するはずです
WebUIからエンドポイント調べたり叩いてみるとうまく動いてるかわかります
デフォルトイメージの最新nodeはv12なのでdepsのoptional chainingがうまく処理されないと辛い
docker: openwhisk/action-nodejs-v14 を使う
バッググラウンド処理
本題・2です
openwhiskではこういう結果を別の方法でまつタイプの関数をnon-blocking関数と呼称し、actionsではAPIのリクエストの末尾に?blocking=trueをつけることで同期的に結果を受け取っています
認証が不要な一般公開エンドポイントではブロッキングが強制されるため、バックグラウンド処理をさせるにはリクエスト時に認証を行う必要があります
IAMトークンのとりかた
code:sh
ibmcloud iam oauth-tokens
code:sh
トークンは5分かそこら?1時間でrevokeされるのでwebhookのように固定的にリクエストを行うことは出来ません
nodeとかでの発行方法は明日調べる
調べた
code:ts
export type IdentityToken = {
access_token: string
refresh_token: "not_supported"
token_type: "Bearer"
expires_in: 3600
expiration: number
scope: "ibm openid"
}
const token = await axios.post<IdentityToken>(
new URLSearchParams({
grant_type: "urn:ibm:params:oauth:grant-type:apikey",
apikey: "API_KEY",
}),
{
headers: {
"Content-Type": "application/x-www-form-urlencoded",
Accept: "application/json",
},
}
);
schema.yamlにクレデンシャルを直書きしない
豆知識編
inputsにはparamsとして渡される値をスキーマとして指定できる
注意点としては、ここのrequiredというのはデプロイ時に既知の固定値を指し、呼び出し時に渡すものに関してはoptional扱いになる
ただ、APIキーなどはyamlに直書きはぜず、VALUEに環境変数を指定して読み取らせる
requiredな値が不明だとこういう表示が出る
code:error
==> manifest_parser.go 185: ERROR_YAML_FILE_FORMAT_ERROR: File: manifest.yaml: Required inputs are missing values even after applying interpolation using env. variables. Please set missing env. variables and/or input values in manifest/deployment file or on CLI for following inputs: optionalInputValue なぜかobject/schemaなどのオブジェクト定義は使えないので、env定数とかじゃなければschema定義から外してもよし
一部のライブラリは既に導入済み
導入済みのライブラリをバンドルすると(バージョン合わせとかでない限り)バンドルサイズが無駄なので、ビルドから除外する
code:webpack.config.ts
externals: {
openwhisk: "commonjs openwhisk",
},
エラーモニタリング
公式のモニタリングは直近実行200件しか見れず、ログ・エラーを外部にDrainする方法もないので、SentryやStackdriverなどでロギングし、通知させるといいです